const Mn         = require('backbone.marionette');
const Cache      = require('../cache');
const Controller = require('../controller');
const Api        = require('../api');
const Helpers    = require('../../lib/helpers');
const template   = require('./main.ejs');

module.exports = Mn.View.extend({
	template: template,
	id:       'dashboard',
	columns:  0,

	stats: {},

	ui: {
		links: 'a'
	},

	events: {
		'click @ui.links': function (e) {
			e.preventDefault();
			Controller.navigate($(e.currentTarget).attr('href'), true);
		}
	},

	templateContext: function () {
		const view = this;

		return {
			getUserName: function () {
				return Cache.User.get('nickname') || Cache.User.get('name');
			},

			getHostStat: function (type) {
				if (view.stats && typeof view.stats.hosts !== 'undefined' && typeof view.stats.hosts[type] !== 'undefined') {
					return Helpers.niceNumber(view.stats.hosts[type]);
				}

				return '-';
			},

			canShow: function (perm) {
				return Cache.User.isAdmin() || Cache.User.canView(perm);
			},

			columns: view.columns
		};
	},

	onRender: function () {
		const view = this;
		if (typeof view.stats.hosts === 'undefined') {
			Api.Reports.getHostStats()
				.then(response => {
					if (!view.isDestroyed()) {
						view.stats.hosts = response;
						view.render();
					}
				})
				.catch(err => {
					console.log(err);
				});
		}
	},

	/**
	 * @param {Object}  [model]
	 */
	preRender: function (model) {
		this.columns = 0;

		// calculate the available columns based on permissions for the objects
		// and store as a variable
		const perms = ['proxy_hosts', 'redirection_hosts', 'streams', 'dead_hosts'];

		perms.map(perm => {
			this.columns += Cache.User.isAdmin() || Cache.User.canView(perm) ? 1 : 0;
		});

		// Prevent double rendering on initial calls
		if (typeof model !== 'undefined') {
			this.render();
		}
	},

	initialize: function () {
		this.preRender();
		this.listenTo(Cache.User, 'change', this.preRender);
	}
});
